package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.auth.AdsrtUser;
import br.com.telescope.auth.User;
import br.com.telescope.t2.AccessPolicy;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.CustomFeature;
import br.com.telescope.t2.feature.MethodFeature;
import br.com.telescope.util.StringReplacer;
import br.com.telescope.util.URLParameters;
import java.sql.SQLException;
import java.util.UUID;
import solutions.ferpa.ztest.ent.*;

/**
 * Requisitar nova senha.
 * <p>
 * Interface que permite reativar uma senha que foi esquecida.
 * <P>
 * Abre uma tela para o usuário informar seu login ou e-mail. O sistema 
 * verifica a informação e envia um e-mail para o usuário. O e-mail 
 * contém um link que permite ao usuário criar uma nova senha para a sua 
 * conta.
 * <P>
 * Se o login/e-mail do usuário não for identificado, o sistema apresenta 
 * uma mensagem de erro e pede para o usuário entrar em contato com o 
 * suporte.
 * <P>
 * 
 * <P>
 * Telescope origin: RTAUTH.REQ_ALT_SENHA
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class ReqAltSenha extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTAUTH.REQ_ALT_SENHA";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Requisitar nova senha");
    }
    
    
    // Record items
    private DomText aEmail;
    
    // Query items
    
    @Override
    public void initAttributes() {
        
        aEmail = new DomText();
        aEmail.context(ctx).name("EMAIL").label("Email/Usuário").unbound(true);
        
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="REQUISITAR_SENHA">
    public class FRequisitarSenha extends CustomFeature {
        
        @Override
        public void initForm() {
            aEmail.setOptional(false);
            addField(aEmail, "rqd");
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("ENVIAR_EMAIL_COM_LINK_REQ_ALT_SENHA")).label("Enviar email");
        }
        
        {
            setFeatureName("REQUISITAR_SENHA");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LOGIN">
    public class FLogin extends CustomFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void execute() {
            try {
                login();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("LOGIN");
            setTitle("Confirmação da recuperação de senha");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="ENVIAR_EMAIL_COM_LINK_REQ_ALT_SENHA">
    public class FEnviarEmailComLinkReqAltSenha extends MethodFeature {
        
        @Override
        public void run() {
            preRun();
            try {
                enviarEmailComLinkReqAltSenha();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("ENVIAR_EMAIL_COM_LINK_REQ_ALT_SENHA");
            setTitle("Enviar");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FRequisitarSenha());
        addFeature(new FLogin());
        addFeature(new FEnviarEmailComLinkReqAltSenha());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "REQUISITAR_SENHA";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getEmail() {
        return aEmail.getValue();
    }
    
    public void setEmail(String value) {
        this.aEmail.setValue(value);
    }
    // </editor-fold>
    
    /**
     * Confirmação da recuperação de senha.
     * <p>
     * Esta funcionalidade é aberta quando o usuário clica no link criado no 
     * e-mail de recuperação de senha.
     * <P>
     * Ao ser aberto:
     * <P>
     * - Verifica se a chave de ativação informada com o link é válida. Se a 
     * chave não for válida, apresenta uma mensagem de erro e aborta a 
     * operação. Uma chave inválida indica um link já utilizado ou que não 
     * tenha sido criado através da função de recuperação de senha.
     * <P>
     * - Autentica a sessão com o usuário que requisitou a recuperação de 
     * senha
     * <P>
     * - Abre uma tela para informar uma nova senha ([t:#752523]).
     * <P>
     * 
     * <P>
     */
    public void login() throws AdsException {
        // <user-code id="15781016" parentId="795775" hashcode="21e0bc62" length="1249">
        // import br.com.telescope.auth.AdsrtUser;
        // import br.com.telescope.auth.User;
        if (!ctx.getParameter("P_HASH").isEmpty()) {
             EntChavesAtivacao chavesAtivacao = new EntChavesAtivacao(ctx);    
        
             try {
                 chavesAtivacao.findByChaveAtivacao(ctx.getParameter("P_HASH"));
                 URLParameters p = (new URLParameters()).put("P_HASH", chavesAtivacao.valueOfChaveAtivacao());
        
                 EntUsuarios usuario = chavesAtivacao.findUsuario();
        
                 ctx.getSession().setObject("MENU", null);
        
                 User user = new AdsrtUser();
                 user.setDisplayName(usuario.valueOfNomeCompleto());
                 user.setEmail(usuario.valueOfEMail());
                 user.setLoginName(usuario.valueOfLogin());
                 user.setId(usuario.valueOfId().toString());
                 user.setSuperUser("S".equals(usuario.valueOfSuperUsuario()));
        
                 ctx.getSession().login(user);
                 chavesAtivacao.del();
        
                 openInterface("ALT_SENHA", p);
        
             } catch (RecordNotFoundException ex) {
                 ctx.pushError(globalName() + ".INVALID_HASH", AdsException.ERROR, "Chave de ativação inválida");
             }            
        } else {
            ctx.pushError(globalName() + ".INVALID_HASH", AdsException.ERROR, "Chave de ativação inválida");
        }
        
        // </user-code>
    }
    
    /**
     * Enviar.
     * <p>
     * Procedimento que envia um email para um interface do REQ_ALT_SENHA 
     * para fazer o processo de login a partir do HASH informado pela url
     */
    private void enviarEmailComLinkReqAltSenha() throws AdsException {
        // <user-code id="795361" parentId="795353" hashcode="-3faae0b0" length="2667">
        // import br.com.telescope.util.StringReplacer;
        // import br.com.telescope.util.URLParameters;
        // import java.util.UUID;
        
        String email = ctx.getParameter("A_EMAIL");
        EntUsuarios usuario = new EntUsuarios(ctx);
        
        try {
            usuario.findByLogin(email);
        } catch (RecordNotFoundException ex) {
            usuario.filterBy().equal(usuario.getEMail(), email);
        
            if (!usuario.next()) {
                ctx.pushError(globalName() + ".CANNOT_RESET_PASSWORD", AdsException.ERROR, "Usuário/senha não encontrada. Contate a administração do sistema!");
                gotoFeature(getFirstFeature(CustomFeature.class), getRecord());
            }
        }
        if (!ctx.hasErrors()) {
            if (usuario.getEMail().isNull()) {
                ctx.pushError(globalName() + ".USER_HAS_NO_EMAIL", AdsException.ERROR, "Usuário não possui E-Mail cadastrado. Contate a administração do sistema!");
            } else {
                EntChavesAtivacao chavesAtivacao = new EntChavesAtivacao(ctx);
        
                try {
                    ctx.beginTransaction();                    
                    chavesAtivacao.setServico("RTAUTH.ALT_SENHA");
                    chavesAtivacao.setChaveAtivacao(UUID.randomUUID());
                    chavesAtivacao.setUsuarioId(usuario.getId());
                    chavesAtivacao.save();
                    ctx.endTransaction();
                } catch (SQLException ex) {
                    try {
                        ctx.abortTransaction();
                    } catch (SQLException ex1) {
                        throw new AdsException(ex1, "",  AdsException.UNKNOWN, ex1.toString());
                    }
                }
        
                StringBuilder htmlEmail = new StringBuilder(200);
                URLParameters p = (new URLParameters()).put("P_HASH", chavesAtivacao.valueOfChaveAtivacao());
        
                String url = ctx.getServiceUrl("RTAUTH.REQ_ALT_SENHA", "LOGIN", p);
        
                htmlEmail.append("Olá <strong>${NOME_COMPLETO}</strong><br /><br />")
                        .append("<a href=\"")
                        .append(url)
                        .append("\">Alterar senha</a>");
        
                String message = new StringReplacer(ctx.getPreference("RTAUTH.ALT_PASSWORD_EMAIL_BODY", htmlEmail.toString()))
                        .setDelimiters("${", "}")
                        .params("NOME_COMPLETO", usuario.valueOfNomeCompleto())
                        .params("EMAIL", usuario.valueOfEMail())
                        .params("LOGIN", usuario.valueOfLogin())
                        .params("URL", url)
                        .toString();
        
                ctx.sendHtmlMail(usuario.getEMail().getValue(), null, ctx.getPreference("RTAUTH.ALT_PASSWORD_EMAIL_SUBJECT", "Resetar senha"), message);
                ctx.showSuccess(ctx.getPreference("RTAUTH.SUCCESS_SEND_EMAIL", "Foi enviado um email para você poder alterar sua senha"));
            }
        }
        // </user-code>
    }
}
